package br.com.menosehmais.framework.test;

import br.com.menosehmais.framework.configuration.PersistenceUnit;
import java.io.File;
import java.io.InputStream;

import org.apache.log4j.Logger;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;

public class DBUnitUtil {

	private static IDatabaseConnection connection;
	
	private static Logger logger = Logger.getLogger(DBUnitUtil.class);

	public static FlatXmlDataSet getDataSet( String pathArquivo) throws Exception {
		// Pega o arquivo de para inserir
		File file = new File(pathArquivo);
		return new FlatXmlDataSetBuilder().build(file);
	}
	
	/**
	 * Metodo que retorna um IDataSet para arquivo de dataset xml localizado no mesmo
	 * diretorio que a classe de teste.
	 * 
	 * Exemplo:
	 * 	Para a classe ProdutoDaoTest, deve-se colocar um arquivo dataset com o 
	 * nome ProdutoDaoTest.xml no mesmo diretorio.
	 * 
	 * Onde usar:
	 * DatabaseOperation.CLEAN_INSERT.execute(DBUnitUtil.getDbUnitConnection(), DBUnitUtil.getDefaultDataSet(ProdutoDAOTest.class));
	 * 
	 * @param clazz
	 * @return IDataSet
	 * @throws Exception
	 */
	public static FlatXmlDataSet getDefaultDataSet( @SuppressWarnings("rawtypes") Class clazz) throws Exception {
		logger.debug("Usando DBUnit default dataset:"+clazz.getName()+".xml");
	
		InputStream inStream = clazz.getClassLoader().getResourceAsStream(clazz.getName()+".xml");
		return new FlatXmlDataSetBuilder().build(inStream);
	}
	

	/**
	 * Metodo que concentra as informacoes de acesso a banco. Futuramente,
	 * essa classe devera pegar as configuracos do persistence.xml
	 * 
	 * Exemplo de Onde usar:
	 * 	DatabaseOperation.CLEAN_INSERT.execute(DBUnitUtil.getDbUnitConnection(), DBUnitUtil.getDefaultDataSet(ProdutoDAOTest.class));
	 * 
	 * @return IDatabaseConnection
	 * @throws Exception
	 */
	public static IDatabaseConnection getDbUnitConnection() throws Exception {
		// database connection
		if (connection == null) {
            connection = new DatabaseConnection(PersistenceUnit.getConnection(PersistenceUnit.TEST));
		}

		return connection;
	}
}
